package com.maple

import java.util.concurrent.TimeUnit

import com.maple.model._
import com.maple.util.{FileUtil, SumUtil}


/**
  * author: HuaZhe Ray
  *
  * describe: Test
  *
  * createDate: 2017/12/14
  * createTime: 18:04
  *
  */
object Test {
  def main(args: Array[String]): Unit = {

    /**
      *   分析各年级的班级数据
      *
      * System.err.println  主要是打出醒目的红色输出
      * TimeUnit.MILLISECONDS.sleep(500) 主要是为了保障控制台打印顺序，以及模拟分析数据
      *
      */
    JdbcRepo.queryGrades().foreach(analyzeClassRootGrades(_))


    /**
      * 分析年级总数据
      */
    val gradeStudents:List[Student] = JdbcRepo.queryStudents()
    System.err.println("\r\n--开始分析年级数据\r\n")

    FileUtil.writeLogToFile("\r\n--开始分析年级数据\r\n")

    TimeUnit.MILLISECONDS.sleep(500)
    analyzeGrade(gradeStudents)

  }


  /**
    * 获得数据库中所有年级 和 班级
    * @param grade
    */
  def analyzeClassRootGrades(grade:Grade): Unit ={

    val clazz = grade.classes.foreach( x=>{

//      System.err.println("\r\n--开始分析班级，班级名字："+x.name+ "\r\n")
      FileUtil.writeLogToFile( s"开始分析班级，班级名字： ${x.name}")
      TimeUnit.MILLISECONDS.sleep(500)
      analyzeClass(x)
      TimeUnit.MILLISECONDS.sleep(500)
    })

  }


  /**
    * 分析班级数据
    * @param clas
    */
  def analyzeClass(clas:Classes): Unit = {
    //总分前五名
//    println("-----------------------总分前五名------------------------------------------")
    FileUtil.writeLogToFile( "-----------------------总分前五名------------------------------------------")

    val result1 = SumUtil.beforeTotal(clas.students,5)

    for(s <- result1){
//      println(s"姓名： ${s.name}  , 总分数： ${s.totalPoints()}")
      FileUtil.writeLogToFile( s"姓名： ${s.name}  , 总分数： ${s.totalPoints()}")
    }

    //单科前五名
//    println("-----------------------单科语文前五名------------------------------------------")
    FileUtil.writeLogToFile( "-----------------------单科语文前五名------------------------------------------")
    val chinese = SumUtil.beforeSingle(clas.students, Lesson("语文"),5)

    for(s <- chinese) {
//      println("姓名：" + s.name+" , 语文分数： "+s.chinesePoints)
      FileUtil.writeLogToFile( s"姓名： ${s.name}  , 语文分数： ${s.chinesePoints}")
    }


//    println("-----------------------单科数学前五名------------------------------------------")
    FileUtil.writeLogToFile( "-----------------------单科数学前五名------------------------------------------")
    val math = SumUtil.beforeSingle(clas.students, Lesson("数学"),5)

    for(s <- math){
//      println("姓名：" + s.name+" , 数学分数： "+s.mathPoints)
      FileUtil.writeLogToFile( s"姓名： ${s.name}  , 数学分数： ${s.mathPoints}")
    }

//    println("-----------------------单科英语前五名------------------------------------------")
    FileUtil.writeLogToFile( "-----------------------单科英语前五名------------------------------------------")
    val english = SumUtil.beforeSingle(clas.students, Lesson("英语"),5)

    for(s <- english) {
//      println("姓名：" + s.name+" , 英语分数： "+s.englishPoints)
      FileUtil.writeLogToFile( s"姓名： ${s.name}  , 英语分数： ${s.englishPoints}")

    }

//    println("-----------------------计算语文平均分------------------------------------------")
    FileUtil.writeLogToFile("-----------------------计算语文平均分------------------------------------------")

    val chineseAve = SumUtil.averageSingle(Repo.getLesson(clas, Lesson("语文")))
//    println("语文平均分： "+chineseAve)
    FileUtil.writeLogToFile(s"语文平均分： ${chineseAve}")

//    println("-----------------------计算数学平均分------------------------------------------")
    FileUtil.writeLogToFile("-----------------------计算数学平均分------------------------------------------")
    val mathAve = SumUtil.averageSingle(Repo.getLesson(clas, Lesson("数学")))
//    println("数学平均分：  "+mathAve)
    FileUtil.writeLogToFile(s"数学平均分： ${mathAve}")


//    println("-----------------------计算英语平均分------------------------------------------")
    FileUtil.writeLogToFile("-----------------------计算英语平均分------------------------------------------")
    val englishAve = SumUtil.averageSingle(Repo.getLesson(clas, Lesson("英语")))
//    println("英语平均分：  "+englishAve)
    FileUtil.writeLogToFile(s"英语平均分： ${englishAve}")

//    println("-----------------------计算语文各分数比例 A B C D------------------------------------------")
    FileUtil.writeLogToFile("-----------------------计算各分数比例 A B C D------------------------------------------")

    FileUtil.writeLogToFile(s"语文   ${SumUtil.averageRank(Repo.getLesson(clas, Lesson("语文")))} ")
//    println(SumUtil.averageRank(Repo.getLesson(clas, Lesson("语文"))))

    FileUtil.writeLogToFile(s"数学   ${SumUtil.averageRank(Repo.getLesson(clas, Lesson("数学")))} ")

    FileUtil.writeLogToFile(s"英语   ${SumUtil.averageRank(Repo.getLesson(clas, Lesson("英语")))} ")

  }

  /**
    * 分析总的年级数据
    * @param student
    */
  def analyzeGrade(student: List[Student]): Unit ={

    //年级总分前10名，因为模拟的静态数据较少，所以前10
//    println("-----------------------年级总分前10名------------------------------------------")
    FileUtil.writeLogToFile("-----------------------年级总分前10名------------------------------------------")
    val gradeTopTen =  SumUtil.beforeTotal(student,10)

    for(s <- gradeTopTen){
//      println(s"姓名：${s.name}    总分数： ${s.totalPoints()}")
      FileUtil.writeLogToFile(s"姓名：${s.name}    总分数： ${s.totalPoints()}")
    }


    //单科状元
//    println("-----------------------年级单科语文状元------------------------------------------")
    FileUtil.writeLogToFile("-----------------------年级单科语文状元------------------------------------------")
    val chinese = SumUtil.beforeSingle(student, Lesson("语文"),1)

    for(s <- chinese) {
//      println(s"姓名：${s.name}    语文分数： ${s.chinesePoints}")
      FileUtil.writeLogToFile(s"姓名：${s.name}    语文分数： ${s.chinesePoints}")
    }


//    println("-----------------------年级单科数学状元------------------------------------------")
    FileUtil.writeLogToFile("-----------------------年级单科数学状元------------------------------------------")
    val math =SumUtil.beforeSingle(student, Lesson("数学"),1)

    for(s <- math){
//      println(s"姓名：${s.name}    数学分数： ${s.mathPoints}")
      FileUtil.writeLogToFile(s"姓名：${s.name}    数学分数： ${s.mathPoints}")
    }

//    println("-----------------------年级单科英语状元------------------------------------------")
    FileUtil.writeLogToFile("-----------------------年级单科英语状元------------------------------------------")
    val english = SumUtil.beforeSingle(student, Lesson("英语"),1)

    for(s <- english) {
//      println(s"姓名：${s.name}    英语分数： ${s.englishPoints}")
      FileUtil.writeLogToFile(s"姓名：${s.name}    英语分数： ${s.englishPoints}")

    }

  }
}
